1 module hip.bind.interpreters;
2 
3 version(Have_bindbc_lua)
4     version = HipremeEngineLua;
5 
6 
7 struct HipInterpreterEntry
8 {
9     HipInterpreter intepreter = HipInterpreter.none;
10     string sourceEntry;
11 }
12 
13 struct InterpreterResult(T)
14 {
15     bool valid;
16     T value;
17     alias value this;
18 }
19 
20 struct InterpreterVoid
21 {
22     bool valid;
23     alias valid this;
24 }
25 
26 enum HipInterpreter
27 {
28     none,
29     lua
30 }
31 
32 alias InterpreterCFunction = extern(C) nothrow void function();
33 interface IHipInterpreter
34 {
35     bool loadFile(string fileName);
36     void reload();
37     bool hasFunction(string funcName);
38     void expose(string funcName, InterpreterCFunction func);
39 }
40 
41 
42 version(HipremeEngineLua)
43 {
44     package __gshared LuaInterpreter _lua;
45     public import hip.bind.interpreters.lua;
46 }
47 
48 void startInterpreter(HipInterpreter interpreter)
49 {
50     final switch(interpreter)
51     {
52         case HipInterpreter.lua:
53             version(HipremeEngineLua)
54                 _lua = new LuaInterpreter();
55             break;
56         case HipInterpreter.none:
57             break;
58     }
59 }
60 
61 void loadInterpreterEntry(HipInterpreter interpreter, string entryPoint)
62 {
63     final switch(interpreter)
64     {
65         case HipInterpreter.lua:
66             version(HipremeEngineLua)
67             {
68                 assert(_lua.loadFile(entryPoint) && 
69                 _lua.hasFunction("HipInitialize") &&
70                 _lua.hasFunction("HipUpdate") &&
71                 _lua.hasFunction("HipRender"),
72             "Lua entrypoint "~entryPoint~" must implement the functions HipInitialize, HipUpdate and HipRender");
73 
74                 _lua.call!LuaVoid("HipInitialize");//, "Invalid HipInitialize";
75             }
76             break;
77         case HipInterpreter.none:break;
78 
79     }
80     
81 }
82 void sendInterpreterFunc(alias func)(HipInterpreter interpreter)
83 {
84     final switch(interpreter)
85     {
86         case HipInterpreter.lua:
87             version(HipremeEngineLua)
88             {
89                 _lua.expose(__traits(identifier, func), &externLua!func);
90             }
91             break;
92         case HipInterpreter.none:
93             break;
94     }
95 }
96 
97 
98 void reloadInterpreter()
99 {
100     version(HipremeEngineLua)
101     {
102         if(_lua !is null)
103             _lua.reload();
104     }
105 }
106 
107 void renderInterpreter()
108 {
109     version(HipremeEngineLua)
110     {
111         if(_lua !is null)
112             _lua.call!(LuaVoid)("HipRender");
113     }
114 }
115 
116 void updateInterpreter()
117 {
118     version(HipremeEngineLua)
119     {
120         if(_lua !is null)
121             _lua.call!(LuaVoid)("HipUpdate");
122     }
123 }